<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 数组->[]  有序数据集合  数组项可以时任意类型的值
        // 数组创建
            // 1 字面量的方式
            // var arr1 = [] ;
            // 2 new 构造函数 的方式
            // var arr2 = new Array()

            // console.log(arr1 , arr2)
        
        // 类型   object
            // console.log( typeof arr1 , typeof(arr2) )


        // 创建区别
        // var arr1 = ["hello"]
        // var arr2 = new Array("china")
        // console.log(arr1 , arr2)
        // 总结 : new的方式创建 只有 一个 数字值 表示 数组 长度  值用empty代替   
        //        否则一律为 数字项


        // 数组的基本操作    
            // 数组.length 可以获取数组长度
            // 数组[下标] 可以访问项   下标出界返回undefined

            // var arr = [ "string" , 123 , true , undefined , null , function(){} , new Date() , [] ]
            // arr ->   1arr_arr.com
            // console.log(arr)
            // console.log(arr.length)
            // console.log(arr[2])

            // 注意 数组.length = 值   可以修改数组的长度   设置0时 会清空一个数组
            // arr.length = 100;  // 92*empty
            // arr.length = 0;  // []
            // console.log(arr , arr[2])  // 清空 访问 下标 出界undefined   

            // 注意 数组[下标] = 值   可以修改数组项   💣💣直接修改 或引用修改 会改变原数组💣💣
            // arr[0] = "china";

            // var arr2 = arr;   // 表示间接 给 arr2赋值为 [ "string" , 123 , true , ....]
            // // 注意: 对象 存储的是栈内存地址不变   即 除了引用为真  一律为假
            // var arr3 = [ "string" , 123 , true , undefined , null , function(){} , new Date() , [] ]
            // // arr3 -> arr1_arr3.com
            // console.log(arr2 === arr , arr3 === arr)

            // arr2[2] = false;
            // console.log(arr2 , arr)

            // 数组的方法 注意: 数组的返回值   注意:数组的改变

            // 添加   返回改变后的数组长度     yes
                // -> 前添   unshift(v1,v2...)
                // -> 后添   push(v1,v2...)
            // var arr = [1,2,3];
            // var res = arr.push("hello" ,  "china" , "js")
            // console.log(res)
            // console.log(arr)

            // 删除   返回删除项     yes
                // -> 前删   shift()
                // -> 后删   pop()
            // var arr = ["hello",1,2,3];
            // var res = arr.pop()
            // console.log(res)
            // console.log(arr)

            // 查找   找到返回下标  找不到-1     no   [与字符串用法一致]
                // -> 前查   indexOf()
                // -> 后查   lastIndexOf()

            // concat  合并数组    返回合并后的新数组   no   [与字符串用法一致]
            // var arr1 = ["hello",1,2,3];
            // var arr2 = [1,2,3]
            // var res = arr1.concat(arr2 , ["a"],"b")
            // console.log(res)
            // console.log(arr1)


            // slice() 截取    返回截取项组成的新数组   no   【与字符串的slice一致】
            // var arr = [ "string" , 123 , true , undefined , null , function(){} , {} , [] ]
            // var res1 = arr.slice()   // 全部
            // var res2 = arr.slice(3)   // 开始到最后
            // var res3 = arr.slice(3,6) // 含头不含尾
            // var res4 = arr.slice(-3)  // 从倒数第3个开始到最后 
            // var res5 = arr.slice(-3,-1)
            // console.log( res5 )
            // console.log(arr)

            // reverse() 翻转数组    返回 翻转 后的新数组   yes   
            var arr = [ "string" , 123 , true , undefined , null , function(){} , {} , [] ]
            var res = arr.reverse();
            console.log(res)
            console.log(arr)

            // sort( function(a,b){} ) 排序    返回 排序 后的新数组   yes   
            // 注意: 该方法接收一个匿名回调函数 该函数接收两个参数  
            // 注意: a - b 升序   b - a 降序
            // var arr = [59,15,23,45,12,45,32,65,45,84];
            // var res = arr.sort( function( a,b ){ return b - a } );
            // console.log(res)
            // console.log(arr)
    </script>
</body>
</html>